/**
 * 
 */
package fr.gfi.agraf.vue.action.gerer.modifiercompte;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import fr.gfi.agraf.exception.AgrafException;
import fr.gfi.agraf.service.IUtilisateurService;
import fr.gfi.agraf.utils.PropertiesUtils;
import fr.gfi.agraf.utils.SpringFactory;
import fr.gfi.agraf.utils.VerificationUtils;
import fr.gfi.agraf.vue.action.AbstractApplicationSupportAction;
import fr.gfi.agraf.vue.action.login.LoginAction;
import fr.gfi.agraf.vue.action.login.ReinitMdpAction;
import fr.gfi.agraf.vue.bean.UtilisateurDTO;

/**
 * @author Zakaria
 *
 */
public class ModifierCompteAction extends AbstractApplicationSupportAction {

	
	
	public static final String ERREUR_SAISIE_NONE = "erreur.saisie.none";

	public static final String ERREUR_SAISIE_EMAIL_IDENTIQUE = "erreur.saisie.email.identique";

	public static final String ERREUR_SAISIE_PASSWORD_CONFIRME = "erreur.saisie.password.confirme";

	public static final String ERREUR_SAISIE_PASSWORD_TAILLE = "erreur.saisie.password.taille";

	public static final String ERREUR_SAISIE_PASSWORD_IDENTIQUE = "erreur.saisie.password.identique";

	public static final String ERREUR_SAISIE_PASSWORD = "erreur.saisie.password";

	public static final String ERREUR_SAISIE_ID = "erreur.saisie.id";

	/**
	 * généré par java
	 */
	private static final long serialVersionUID = 2244933301375965422L;

	private Long id;
	private String oldPassword;
	private String newPassword;
	private String newPassword2;
	private String oldEmail;
	private String email;

	/**
	 * Logger
	 */
	private final static Logger LOGGER = Logger.getLogger(ModifierCompteAction.class);
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.vue.action.AbstractApplicationSupportAction#executeAction()
	 */
	@Override
	public String executeAction() throws Exception {
		if(!validateBis()){
			return ERROR;
		}
		// créé utilisateurDTO
		final UtilisateurDTO utilisateurDTO = creerUtilisateurDTO();
		UtilisateurDTO newUtilisateurDTO = null;
		// récupere le service
		final IUtilisateurService utilisateurService = (IUtilisateurService) SpringFactory
				.getApplicationContext().getBean(LoginAction.UTILISATEUR_SERVICE);
		try {
			// appel au service
			newUtilisateurDTO = utilisateurService.modifierUtilisateur(utilisateurDTO, false);
		} catch (final AgrafException ae) {
			// Recupére le message d'erreur
			final String messageErreur = PropertiesUtils.getProperty(ae.getKey());
			// Ajoute action error
			addActionError(messageErreur);
			LOGGER.error(messageErreur,ae);
			return ERROR;
		}
		// met à jour l'utilisateur en session
		sessionMap.put(LoginAction.UTILISATEUR, newUtilisateurDTO);
		return SUCCESS;
	}

	/**
	 * Créé utilisateurDTO à partir des attributs saisis
	 * 
	 * @return
	 */
	private UtilisateurDTO creerUtilisateurDTO() {
		final UtilisateurDTO utilisateurDTO = new UtilisateurDTO();
		utilisateurDTO.setId(id);
		utilisateurDTO.setMotDePasse(oldPassword);
		utilisateurDTO.setNewMotDePasse(newPassword);
		utilisateurDTO.setEmail(oldEmail);
		utilisateurDTO.setNewEmail(email);
		return utilisateurDTO;
	}


	
	/**
	 * Methode de contournement pour le problème avec la methode validate (pas de passage des actionerror)
	 * 
	 * @return
	 */
	private boolean validateBis(){
		if (id == null || id == 0) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_ID));
			return false;
		}

		if (StringUtils.isBlank(oldPassword)) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_PASSWORD));
			return false;
		}

		if (StringUtils.equals(oldPassword, newPassword)) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_PASSWORD_IDENTIQUE));
			return false;
		}

		if (StringUtils.isNotBlank(newPassword) && newPassword.length() < 6) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_PASSWORD_TAILLE));
			return false;
		}

		if ((StringUtils.isNotBlank(newPassword) || StringUtils.isNotBlank(newPassword2))
				&& !StringUtils.equals(newPassword, newPassword2)) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_PASSWORD_CONFIRME));
			return false;
		}

		if (StringUtils.isNotBlank(email) && !VerificationUtils.isEmailValide(email)) {
			addActionError(PropertiesUtils.getProperty(ReinitMdpAction.ERREUR_EMAIL_INVALIDE));
			return false;
		}
		if (StringUtils.isBlank(newPassword) && StringUtils.isBlank(email)) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_NONE));
			return false;
		}
		return true;
	}

	/**
	 * @return the oldPassword
	 */
	public String getOldPassword() {
		return oldPassword;
	}

	/**
	 * @param oldPassword
	 *            the oldPassword to set
	 */
	public void setOldPassword(final String oldPassword) {
		this.oldPassword = oldPassword;
	}

	/**
	 * @return the newPassword2
	 */
	public String getNewPassword2() {
		return newPassword2;
	}

	/**
	 * @param newPassword2
	 *            the newPassword2 to set
	 */
	public void setNewPassword2(final String newPassword2) {
		this.newPassword2 = newPassword2;
	}

	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * @param email
	 *            the email to set
	 */
	public void setEmail(final String email) {
		this.email = email;
	}

	/**
	 * @return the oldEmail
	 */
	public String getOldEmail() {
		return oldEmail;
	}

	/**
	 * @param oldEmail
	 *            the oldEmail to set
	 */
	public void setOldEmail(final String oldEmail) {
		this.oldEmail = oldEmail;
	}

	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(final Long id) {
		this.id = id;
	}

	/**
	 * @return the newPassword
	 */
	public String getNewPassword() {
		return newPassword;
	}

	/**
	 * @param newPassword
	 *            the newPassword to set
	 */
	public void setNewPassword(final String newPassword) {
		this.newPassword = newPassword;
	}

}
